package com.xc.disk.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xc.disk.info.TokenInfo;
import com.xc.disk.bean.FolderBean;
import com.xc.disk.dto.FolderDto;
import com.xc.disk.entity.FolderEntity;
import com.xc.disk.info.CrossPointInfo;
import com.xc.disk.info.SubdirectoryInfo;

import java.util.List;
import java.util.function.Consumer;


/**
 * <p>项目名称: Stars</p>
 * <p>描述: 文件夹服务类接口</p>
 * <P>创建人: 小程</p>
 * <P>创建人邮箱: 779943476@qq.com</p>
 * <p>创建时间: 2019/07/25</p>
 *
 * @version v1.0
 */
public interface FolderService extends IService<FolderEntity> {
    /**
     * 添加
     *
     * @param token      token信息
     * @param folderBean 要添加的数据
     * @return 添加成功的数据
     */
    public FolderEntity createFolder(TokenInfo token, FolderBean folderBean);

    /**
     * 修改目录
     *
     * @param id   目录id
     * @param name 目录名称
     * @return 修改后的文件目录信息
     */
    public FolderEntity updateFolder(TokenInfo token, String id, String name);

    /**
     * 查询所有数据
     *
     * @param token    token信息
     * @param parentId 父级id
     * @return 返回查询到的文件和文件目录集合
     */
    public FolderDto getFolderFileList(TokenInfo token, String parentId);


    /**
     * 根据id集合删除文件夹和文件信息
     *
     * @param token     token信息
     * @param folderIds 文件夹id集合
     * @param fileIds   文件id集合
     */
    public void deleteFolderAndFileByIds(TokenInfo token, List<String> folderIds, List<String> fileIds);

    /**
     * 获取id下所有的子集
     *
     * @param folders 下级目录集合
     * @return 子集id集合
     */
    public List<FolderEntity> getSubsetFolders(List<FolderEntity> folders);

    /**
     * 递归获取id的所有父集的id
     *
     * @param folderId 目录id
     * @return 父集id集合
     */
    public List<FolderEntity> getParentFolders(String folderId);


    /**
     * 根据父级id获取文件目录集合
     *
     * @param parentId 父级id
     * @return 文件目录集合
     */
    public List<FolderEntity> getFoldersByParentId(String parentId);

    /**
     * 递归创建目录
     *
     * @param folderIds 目录集合多少级目录多少个
     * @param index     当前层次
     * @param userId    用户主键
     * @param parentId  上级目录id
     * @return 目录id
     */
    public String createFolder(List<String> folderIds, int index, String userId, String parentId);

    /**
     * 寻找目录的交叉点
     *
     * @param folderId       开始目录id
     * @param newFolderId    开始新目录id
     * @param crossPointInfo 记录寻找过的文件
     * @param action         找到交叉点返回有开始id，到交叉点的数据处理方法
     */
    public boolean seekFolderCrossPoint(String folderId, String newFolderId, CrossPointInfo crossPointInfo, Consumer<CrossPointInfo> action);

    /**
     * 递归遍历文件下级目录
     *
     * @param parentId    旧的父级id
     * @param newFolderId 新的父级id
     * @param action      回调方法
     */
    public void subdirectoryHandle(String parentId, String newFolderId, Consumer<SubdirectoryInfo> action);

    /**
     * 减去上级目录大小
     *
     * @param folderId 目录id
     * @param size     减去大小
     */
    public void subtractFolderSize(String folderId, long size);

    /**
     * 添加Size
     *
     * @param parentId 上级目录id
     * @param size     添加的大小
     */
    public void addFolderSize(String parentId, long size);

    /**
     * 验证新目录是否在旧目录下面
     *
     * @param parentId    旧目录id
     * @param newParentId 新目录id
     * @return true:在就目录下面，false：不在
     */
    public boolean verifyFolder(String parentId, String newParentId);

    /**
     * 获取根目录
     *
     * @param id 目录id
     * @return 根目录
     */
    public FolderEntity getRootFolders(String id);

    /**
     * 删除文件源
     *
     * @param hashCodes 文件源集合
     */
    public void deleteSourceInfo(List<String> hashCodes);

    /**
     * 验证文件源是否可以删除
     *
     * @param hashCodes 文件hash值
     * @param batchSize 多少要数据处理一次
     * @param action    回调
     */
    public void verifyHashCode(List<String> hashCodes, int batchSize, Consumer<List<String>> action);

    /**
     * 删除文件源
     *
     * @param hashCodes 文件hash值
     * @param localUrl  文件所在服务器地址
     * @param secret    秘钥
     */
    public void deleteSource(List<String> hashCodes, String localUrl, String secret);
}
